package com.hns.can.service.service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.hns.can.master.entity.BaseCarInfoEntity;
import com.hns.can.master.entity.BaseDrvInfoEntity;
import com.hns.can.master.entity.BaseLineInfoEntity;
import com.hns.can.service.entity.BaseDriverExamUploadErrEntity;
import com.hns.can.service.enumrate.CheckExcel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.hns.tool.pub.DateTool;
import com.hns.tool.pub.PubUtil;
import com.hns.tool.pub.UtilString;

/**
 * @版权：HNS 版权所有 (c) 2013
 * @author:JeffXu
 * @version Revision 1.0.0
 * @email:835264047@qq.com
 * @see:
 * @创建日期：2014-8-15
 * @功能说明：校验驾驶员考勤导入数据
 * @begin
 * @修改记录:
 * @修改后版本          修改人          修改内容
 * @2014-8-15            JeffXu         创建
 * @end
 */
@Component
public class CheckDrvExamFilter {
    
    @Autowired
    private BaseDriverExamInfoService baseDriverExamInfoService;
    
    public boolean doCheck(String corpId, List<BaseDriverExamUploadErrEntity> list) throws Exception {
        boolean hasAbnormalData = false;// 这批导入的数据，是否存在异常数据
        for(int i = 0; i < list.size(); i++){
            BaseDriverExamUploadErrEntity entity = list.get(i);
            for(int j=0;j<list.size();j++){
        		if(i!=j){
        			BaseDriverExamUploadErrEntity repeatEntity = list.get(j);
            		if(entity.getDrvName().equals(repeatEntity.getDrvName()) && 
            		   entity.getLicPltNo().equals(repeatEntity.getLicPltNo()) && 
            		   entity.getSignInTime().equals(repeatEntity.getSignInTime())&&
            		   entity.getSignOutTime().equals(repeatEntity.getSignOutTime())&&
            		   entity.getOprtLine().equals(repeatEntity.getOprtLine())&&
            		   entity.getTimecardCardno().equals(repeatEntity.getTimecardCardno())){
            		   list.remove(j);
            		}
        		}
        	}
            if (checkNull(entity)/* 校验出现空值 */||
//            	checkRepeat(i,list)/*去除重复*/||	
                checkDateFormat(entity) /* 日期格式出现错误 */|| 
                checkTimeInterval(entity)/* 开始时间大于结束时间 ，同时时间跨度不能超过24小时 */|| 
                checkLine(corpId, entity)/* 线路不存在 */||
                checkCar(corpId, entity)/* 车辆不存在 */||
                checkDriver(corpId, entity)/* 驾驶员不存在 */||
                checkSignTime(i, list)/* 考勤时间出现重叠 */) {
                if(!hasAbnormalData){
                    hasAbnormalData = true;
                }
                continue;
            }
            // 校验全部通过
            entity.setErrorType(CheckExcel.DATA_IS_NORMAL.getFlag());
            entity.setErrorHint(CheckExcel.DATA_IS_NORMAL_TIP.getFlag());
        }
        
        return hasAbnormalData;
    }
    
    /**
     * @param entity
     * @author:JeffXu
     * @email:835264047@qq.com
     * @创建日期:2014-8-15
     * @功能说明：校验空值
     */
    private boolean checkNull(BaseDriverExamUploadErrEntity entity) {
        boolean result = false;
        if (PubUtil.isEmpty(entity.getOprtLine()) || PubUtil.isEmpty(entity.getLicPltNo()) || PubUtil.isEmpty(entity.getDrvName()) || PubUtil.isEmpty(entity.getTimecardCardno()) || PubUtil.isEmpty(entity.getSignInTime()) || PubUtil.isEmpty(entity.getSignOutTime())) {
            // 当存在空数据时
            result = true;
            entity.setErrorType(CheckExcel.DATA_IS_EMPTY.getFlag());
            entity.setErrorHint(CheckExcel.DATA_IS_EMPTY_TIP.getFlag());
        }
        return result;
    }
    
    private boolean checkRepeat(Integer i, List<BaseDriverExamUploadErrEntity> list) {
    	boolean result = false;
    	BaseDriverExamUploadErrEntity entity = list.get(i);
    	for(int j=0;j<list.size();j++){
    		if(i!=j){
    			BaseDriverExamUploadErrEntity repeatEntity = list.get(j);
        		if(entity.getDrvName().equals(repeatEntity.getDrvName()) && 
        		   entity.getLicPltNo().equals(repeatEntity.getLicPltNo()) && 
        		   entity.getSignInTime().equals(repeatEntity.getSignInTime())&&
        		   entity.getSignOutTime().equals(repeatEntity.getSignOutTime())&&
        		   entity.getOprtLine().equals(repeatEntity.getOprtLine())&&
        		   entity.getTimecardCardno().equals(repeatEntity.getTimecardCardno())){
        		   list.remove(j);
        		   result = true;
        		}
    		}
    	}
    	return result;
    }
    
    /**
     * @param entity
     * @author:JeffXu
     * @email:835264047@qq.com
     * @创建日期:2014-8-15
     * @功能说明：校验时间格式
     */
    private boolean checkDateFormat(BaseDriverExamUploadErrEntity entity) {
        boolean result = false;
        String signInTime = entity.getSignInTime();
        String signOutTime = entity.getSignOutTime();
        
        Pattern pattern = Pattern
            .compile("^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$");
        Matcher matcher1 = pattern.matcher(signInTime);
        Matcher matcher2 = pattern.matcher(signOutTime);
        if (!matcher1.matches() || !matcher2.matches()) {
            // 时间格式有误
            result = true;
            entity.setErrorType(CheckExcel.DATE_FORMAT_ERROR.getFlag());
            entity.setErrorHint(CheckExcel.DATE_FORMAT_ERROR_TIP.getFlag());
        }
//        try {
//        	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        	Date signIn = formatter.parse(signInTime);
//        	Date signOut = formatter.parse(signOutTime);
//		} catch (Exception e) {
//			// TODO: handle exception
//			result = true;
//			entity.setErrorType(CheckExcel.DATE_FORMAT_ERROR.getFlag());
//			entity.setErrorHint(CheckExcel.DATE_FORMAT_ERROR_TIP.getFlag());
//		}
        
        return result;
    }
    
    /**
     * @param entity
     * @return
     * @author:JeffXu
     * @email:835264047@qq.com
     * @创建日期:2014-10-16
     * @功能说明：校验时间区间，开始时间是否大于结束时间，时间跨度超过24小时
     */
    private boolean checkTimeInterval(BaseDriverExamUploadErrEntity entity) throws Exception {
        boolean result = false;
        String signInTime = entity.getSignInTime();
        String signOutTime = entity.getSignOutTime();
        
        if(DateTool.compareDate(signInTime, signOutTime)){
            // 开始时间大于结束时间
            result = true;
            entity.setErrorType(CheckExcel.TIME_INTERVAL_ERROR.getFlag());
            entity.setErrorHint(CheckExcel.TIME_INTERVAL_ERROR_TIP.getFlag());
        }else if(DateTool.calculateTimeForTimeUnit(signInTime, signOutTime, DateTool.TIME_UNIT_HOUR) > 24){
            //时间跨度超过24小时
            result = true;
            entity.setErrorType(CheckExcel.EXAM_TIME_MORE_THAN_24.getFlag());
            entity.setErrorHint(CheckExcel.EXAM_TIME_MORE_THAN_24_TIP.getFlag());
        }
        return result;
    }
    
    /**
     * @param entity
     * @author:JeffXu
     * @email:835264047@qq.com
     * @创建日期:2014-8-15
     * @功能说明：校验线路是否存在
     */
    private boolean checkLine(String corpId, BaseDriverExamUploadErrEntity entity) {
        boolean result = false;
        BaseLineInfoEntity line = baseDriverExamInfoService.getLineIdByLineName(corpId, entity.getOprtLine());
        if (PubUtil.isEmpty(line)) {
            // 没有对应的线路信息
            result = true;
            entity.setErrorType(CheckExcel.LINE_NO_EXIST.getFlag());
            entity.setErrorHint(CheckExcel.LINE_NO_EXIST_TIP.getFlag());
        } else {
            entity.setLineId(line.getLineId());
        }
        return result;
    }
    
    /**
     * @param entity
     * @author:JeffXu
     * @email:835264047@qq.com
     * @创建日期:2014-8-15
     * @功能说明：校验车辆是否存在
     */
    private boolean checkCar(String corpId, BaseDriverExamUploadErrEntity entity) {
        boolean result = false;
        BaseCarInfoEntity car = baseDriverExamInfoService.getCarIdByLicPltNo(corpId, entity.getLicPltNo());
        if (PubUtil.isEmpty(car)) {
            // 没有对应的车辆信息
            result = true;
            entity.setErrorType(CheckExcel.CAR_NO_EXIST.getFlag());
            entity.setErrorHint(CheckExcel.CAR_NO_EXIST_TIP.getFlag());
        } else {
            entity.setCarId(car.getCarId());
        }
        return result;
    }
    
    /**
     * @param entity
     * @author:JeffXu
     * @email:835264047@qq.com
     * @创建日期:2014-8-15
     * @功能说明：校验驾驶员是否存在
     */
    private boolean checkDriver(String corpId, BaseDriverExamUploadErrEntity entity) {
        boolean result = false;
        BaseDrvInfoEntity driver = baseDriverExamInfoService.getDrvByTimecardCardno(corpId, entity.getTimecardCardno());
        if (PubUtil.isEmpty(driver)) {
            // 没有对应的驾驶员信息
            result = true;
            entity.setDrvId(UtilString.getUUID());
            entity.setErrorType(CheckExcel.DRIVER_NO_EXIST.getFlag());
            entity.setErrorHint(CheckExcel.DRIVER_NO_EXIST_TIP.getFlag());
            return result;
        }else if (!driver.getDrvName().equals(entity.getDrvName())) {
              // 考勤卡号出现重叠
        	result = true;
            entity.setErrorType(CheckExcel.TIMECARD_CARDNO_EXIST.getFlag());
            entity.setErrorHint(CheckExcel.DRIVER_NO_EXIST_TIP.getFlag());
          }
        //驾驶员ID 不能为空
        entity.setDrvId(driver.getDrvId());
        return result;
    }
    
    /**
     * @param i
     * @param list
     * @return
     * @throws Exception
     * @author:JeffXu
     * @email:835264047@qq.com
     * @创建日期:2014-8-28
     * @功能说明：校验考勤签到签退时间是否和其他考勤时间有交集(先校验list，再校验db)
     * @检验规则：同一辆
     */
    private boolean checkSignTime(Integer i, List<BaseDriverExamUploadErrEntity> list) throws Exception {
        BaseDriverExamUploadErrEntity entity = list.get(i);
//         list校验：(看是否与导入的数据时间重叠)
        try {
        	for(int j = 0; j < list.size(); j++){
                if(i != j){
                    BaseDriverExamUploadErrEntity tmpEntity = list.get(j);
                    if (entity.getLicPltNo().equals(tmpEntity.getLicPltNo()) 
                                && ((DateTool.compareDate(entity.getSignInTime(), tmpEntity.getSignInTime()) 
                                    && !DateTool.compareDate(entity.getSignInTime(), tmpEntity.getSignOutTime())) 
                                || (DateTool.compareDate(entity.getSignOutTime(), tmpEntity.getSignInTime()) 
                                    && !DateTool.compareDate(entity.getSignOutTime(), tmpEntity.getSignOutTime())))) {
                        // 考勤时间出现重叠
                        entity.setErrorType(CheckExcel.EXAM_TIME_EXIST.getFlag());
                        entity.setErrorHint(CheckExcel.EXAM_TIME_EXIST_TIP.getFlag());
                        return true;
                    }
                }
            }
		} catch (Exception e) {
			// TODO: handle exception
			if(PubUtil.isEmpty(entity.getErrorType())){
				return false;
			}
			
		}
                // 数据库校验：(看是否与已存在的数据时间重叠)
        if (baseDriverExamInfoService.checkDrvExamTimeIncludedDB(entity)) {
            // 考勤时间发生重叠
            entity.setErrorType(CheckExcel.EXAM_TIME_EXIST.getFlag());
            entity.setErrorHint(CheckExcel.EXAM_TIME_EXIST_TIP.getFlag());
            return true;
        }
        // list和数据库都校验通过
        return false;
    }
    
    public static void main(String[] args) {
        Pattern pattern = Pattern
            .compile("^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$");
        Matcher matcher = pattern.matcher("2014-12-12 12:30:50");
        System.out.println(matcher.matches());
    }
    
}